package cn.xiaolang.function.design_pattern.dynamic.proxy.pattern.cglib;

import cn.xiaolang.function.design_pattern.dynamic.proxy.pattern.jdk.AnimalService;

/**
 * cglib动态代理（可以直接针对代理类，或代理类的子类进行代理）
 * JDK动态代理和CGLib动态代理都是运行时增强，通过将横切代码植入代理类的方式增强。
 * 与此不同的是AspectJ，它能够在通过特殊的编译器在编译时期将横切代码植入增强，这样的增强处理在运行时候更有优势
 * 因为JDK动态代理和CGLib动态代理每次运行都需要增强。
 * <p>
 * CGLIB的缺点是创建代理对象的速度慢，Javassist的缺点是需要手动编写Java源码。
 * <p>
 * 如果非要在这个两个中选择一个，那么只有在对性能要求非常高的情况下选择Javassist，其他一般情况下，个人认为CGLIB是比较合适的。
 *
 * @author fuhw
 * @date 2016年4月19日 下午3:18:27
 */
public class GetStarted {

    public static void main(String[] args) {

        CglibProxyFactory proxyFactory = new CglibProxyFactory();
        // 对类代理
        DogService dog = (DogService) proxyFactory.getProxyInstance(DogService.class);
        dog.eat();
        dog.sleep();
        // 对接口代理
        AnimalService animalService = (AnimalService) proxyFactory.getProxyInstance(AnimalService.class);
        animalService.eat();
        animalService.sleep();
    }
}
